#ifndef _MENU_H_
#define _MENU_H_

#include "jogo.h"
#include "equipa.h"
#include "login.h"
#include "campeonato.h"
#include <string>
#include <vector>

using namespace std;

//! Struct utilizador_em_rede
/*! Corresponde ao utilizador que esta actualmente a usar o programa */
struct utilizador_em_rede
{
    string nome; /*!< Nome do utilizador */
    int nivel; /*!< Nivel de aceso do utilizador */
};

//! Classe Menu
/*! Esta classe esta encarregue de executar todas as operacoes que involvem os menus mostrados ao utilizador */
class Menu
{
public:
    //! Construtor
    /*! Os vectores sao passados por referencia, para se poder obter as suas alteracoes na funcao main no ficheiro main.cpp
      \param lis_eq Lista de Equipas
      \param lis_jg lista de jogos
      \param lis_camp Lista de campeonatos
    */
    Menu(vector<Equipa>& lis_eq, vector<Jogo>& lis_jg, vector<Campeonato>& lis_camp);
    //!Destrutor
    ~Menu();

    //! Mostra o menu principal
    void menu_principal();
    //! Mostra o menu de equipas (opcao 1 no menu principal)
    void mostrar_equipas();
    //! Procura uma equipa (opcao 2 no menu principal)
    void procurar_equipa();
    //! Mostra todos os jogos (opcao 3 no menu principal)
    void mostrar_jogos_todos();

    //! Menu usado para efectuar o login no programa
    int fazer_login();
    //! Menu que permite escolher o campeonato a que se vai aceder (opcao 4 no menu principal)
    void escolher_campeonato();

    // Opcoes do so disponiveis ao administrador
    //! Menu que permite adicionar uma equipa a um campeonato (opcao 5 no menu principal)
    void adicionar_equipa_campeonato();
    //! Menu que permite adiciona um jogador a uma equipa (opcao 6 no menu principal)
    void adicionar_jogador_equipa();
    //! Menu que cria um novo campeonato (opcao 7 no menu principal)
    void criar_novo_campeonato();
    //! Menu que adiciona um jogo a um campeonato (opcao 8 no menu principal)
    void adicionar_jogo_campeonato();
    //! Menu adiciona um novo utilizador ao programa (opcao 9 no menu principal)
    void adicionar_novo_utilizador();

private:
    //! Variavel privada nome_utilizador
    string nome_utilizador; // FIXME: variavel obsoleta, deve de ser substituida pela estrutura pessoa_logged_in

    //! Variavel privada log_manager do tipo Login
    Login log_manager;

    //! Armazena informacao da pessoa que esta actualmente a usar o programa
    utilizador_em_rede pessoa_logged_in;
    //! Lista das equipas
    vector<Equipa> lista_equipas;
    //! Lista dos jogos
    vector<Jogo> lista_jogos;
    //! Lista dos campeonatos
    vector<Campeonato> lista_campeonatos;

    //! Variavel privada campeonato_actual
    /*! Indica qual e o indice do campeonato a que estamos a aceder
      Se o valor for -1, entao estamos a aceder a informacao nos campeonatos todos (nao implementado) */
    int campeonato_actual;

    //! Indica se uma string e composta de numeros
    bool e_numero(string num);

    //! Obriga o programa a parar e a introducir uma tecla para continuar
    void esperar_input();
};

#endif /* _MENU_H_ */
